# 数据结构 列表 元组 集合 字典
# 列表
# 创建
list1 = [1, 2, 3, 4, 5]
list2 = [10, 12.5, "猪猪侠", True]
print(list1)
print(list2[2])
# 插入
list1.append(6)  # 末尾插入
list1.extend([7, 8, 9])  # 末尾插入新的list
list1.insert(1, 100)  # 指定位置插入
print(list1)

# 删除
list1.pop()  # 删除末尾元素
list1.pop(1)  # 删除指定位置元素
del list1[1]  # 删除指定位置元素
print(list1)

# 切片
list3 = list1[1:3]  # 左闭右开
print(list3)
# 长度
print(len(list3))
# 反转
print(list1)
list1.reverse()
print(list1)

# 元组
# 元组与列表的不同在于，元组内的数据在定义后不能被修改。可以对元组进行遍历和切片，其方法与列表相似
# 由于元组（tuple）中的数据无法被修改，因此一般在其中存放常量或者是保护数据。
tu1 = ("文章盖世，孔子厄于陈邦", "武略超群，太公钓于渭水", "颜渊命短，殊非凶恶之徒；盗跖年长，岂是善良之辈。")
print(tu1)
for tu in tu1:
    print(tu)

# 将元组转换为列表
list4 = list(tu1)
print(list4)

# 将列表转换为元组
tu2 = tuple(list4)
print(tu2)

# 集合
# 集合（set）不能包含重复元素，所以在项目里经常通过集合来实现去除重复数据的效果。
# 可以通过大括号或set()方法来创建集合
# 创建
set1 = {"文章盖世，孔子厄于陈邦", "武略超群，太公钓于渭水", "颜渊命短，殊非凶恶之徒；盗跖年长，岂是善良之辈。",
        "尧帝明圣，却生不肖之儿；瞽叟愚顽，反生大孝之子。", "张良原是布衣，萧何曾为县吏。", "晏子身无五尺，封作齐国宰相；孔明卧居草庐，能作蜀汉军师。"}
set2 = {10, 20, 30, 40, 50}
print(set1)
print(set2)

# 长度
print(len(set1))
# 新增
set2.add(60)
print(set2)
# 删除
set2.remove(10)  # 删除指定元素，如果元素不存在，会报错
set2.discard(70)  # 删除指定元素，如果元素不存在，不会报错
# 清空
set3 = set2.copy()
print(set3)
set3.clear()
print(set3)
print(set2)

set4 = {30, 40, 50, 60, 70, 80, 90, 100, 110}

# 交集
print(set2 & set4)
print(set2.intersection(set4))
# 并集
print(set2 | set4)
print(set2.union(set4))
# 差集
print(set2 - set4)
print(set4 - set2)
print(set2.difference(set4))

# 字典（dict）以“键值对”的形式存放数据。从语法角度来看，在字典里可以存储任何格式的数据
# 在Python里使用大括号定义字典，其中每个键值对用冒号分隔，而每个键值对之间用逗号分隔。
# 如果出现一个键对应多个值时，后面的值会替换掉前面的。
scoreDict = {"张三": 95, "李四": 85, "王五": 80, "张三": 90, "赵六": 75}
print(scoreDict)
print(scoreDict["张三"])  # 如果我们企图访问一个不存在的键，就会出现异常。

# 增加
scoreDict2 = scoreDict.copy()
scoreDict2["伏地魔"] = 100
print(scoreDict2)
# 删除
del scoreDict2["王五"]
# 修改
scoreDict2["张三"] = 99
print(scoreDict2)
scoreDict2.update({"张三": 100})
print(scoreDict2)
scoreDict2.update({"苟分仔": 99, "苟富仔": 99})  # 没有键时是新增
print(scoreDict2)

# 遍历
print("遍历！！！！！！！！")

# 输出键
for key in scoreDict2.keys():
    print(key)

# 输出值
for value in scoreDict2.values():
    print(value)

# 输出键值
for (key, value) in scoreDict2.items():
    print(key, value)

# 输出键值对
for key in scoreDict2:
    print(key, scoreDict2[key])
# 输出键的另一种方式
for kv in scoreDict2:
    print(kv)
